package br.com.itc.componentes.modulos
{
	import br.com.itc.componentes.Alerta;
	import br.com.itc.componentes.MostraCursor;
	import br.com.itc.componentes.containers.CanvasITC;
	import br.com.itc.componentes.containers.JanelaView;
	import br.com.itc.componentes.dto.SCReqDTO;
	import br.com.itc.componentes.dto.SelGeralReqDto;
	import br.com.itc.componentes.titulo.SubtituloView;
	import br.com.itc.componentes.util.servico.ServicoJavaUtil;
	
	import flash.events.MouseEvent;
	
	import mx.collections.ArrayCollection;
	import mx.containers.TabNavigator;
	import mx.core.UIComponent;
	import mx.events.FlexEvent;
	import mx.events.ListEvent;
	import mx.rpc.events.ResultEvent;
	
	public class ListaCadastro extends JanelaView implements IListaCadastro
	{
		
		private var _janelaParent: ListaCadastro;
		
		private var _barraBotoes: BarraBotoesITC;
		
		private var _tabela: DataGridITC;
		
		[Bindable]
		private var _listaItensTabela: ArrayCollection = new ArrayCollection;
		
		private var _formularioCadastro: FormularioCadastro;
		
		private var _objetoSelecionado: Object;
		
		private var _janelaParentWidth: int;
		private var _janelaParentHeigth: int;

		private var _janelaCadastroWidth: int;
		private var _janelaCadastroHeigth: int;
		
		private var _alterarTituloJanela: Boolean = false;
		
		private var _destinoServicoJava: String;
		
		private var regInc: RegExp = /Manter|Incluir|Alterar|Visualizar/;
		
		public static var OPERACAO_EXCLUIR_DADOS: String = "excluirDados";
		public static var OPERACAO_LISTAR_DADOS: String = "obterDados";
		
		public function ListaCadastro()
		{
			this.addEventListener(FlexEvent.CREATION_COMPLETE, init);
		}
		
		// Getter and Setter
		public function get barraBotoes(): BarraBotoesITC {
			return this._barraBotoes;
		}
		
		[Bindable]
		public function set barraBotoes(barraBotoes: BarraBotoesITC): void {
			this._barraBotoes = barraBotoes;
		}
		
		public function get objetoSelecionado(): Object {
			return this._objetoSelecionado;
		}
		
		public function set objetoSelecionado(objetoSelecionado: Object): void {
			this._objetoSelecionado = objetoSelecionado;
		}
		
		public function get alterarTituloJanela(): Boolean {
			return this._alterarTituloJanela;
		}
		
		public function set alterarTituloJanela(alterarTituloJanela: Boolean): void {
			this._alterarTituloJanela = alterarTituloJanela;
		}
		
		public function get tabela(): DataGridITC {
			return this._tabela;
		}
		
		[Bindable]
		public function set tabela(tabela: DataGridITC): void {
			this._tabela = tabela;
		}
		
		public function get formularioCadastro(): FormularioCadastro {
			return this._formularioCadastro;
		}
		
		public function get destinoServicoJava(): String {
			return this._destinoServicoJava;
		}
		
		public function set destinoServicoJava(destino: String): void {
			this._destinoServicoJava = destino;
		}		
		
		[Bindable]
		public function set formularioCadastro(formularioCadastro: FormularioCadastro): void {
			this._formularioCadastro = formularioCadastro;
			configurarJanelaCadastro();
		}
		
		// Métodos auxiliares
		
		private function configurarJanelaCadastro(): void {
			_janelaCadastroWidth = formularioCadastro.width;
			_janelaCadastroHeigth = formularioCadastro.height;
			this._formularioCadastro.janelaSelecao = this;
		}
		
		private function configurarBarraBotoes(): void {
			habilitarBotoesLista();
			
			barraBotoes.document.btnVisualizar.addEventListener(MouseEvent.CLICK, botaoVisualizarPressionado);	
			barraBotoes.document.btnIncluir.addEventListener(MouseEvent.CLICK, botaoIncluirPressionado);	
			barraBotoes.document.btnAlterar.addEventListener(MouseEvent.CLICK, botaoAlterarPressionado);	
			barraBotoes.document.btnExcluir.addEventListener(MouseEvent.CLICK, desejaExcluir);	
			barraBotoes.document.btnFechar.addEventListener(MouseEvent.CLICK, botaoFecharPressionado);	
		}
		
		private function habilitarBotoesLista(): void {
			
			barraBotoes.document.btnVisualizar.enabled = true;
			barraBotoes.document.btnAlterar.enabled = true;
			barraBotoes.document.btnExcluir.enabled = true;
			
			if (objetoSelecionado == null) {
				barraBotoes.document.btnVisualizar.enabled = false;
				barraBotoes.document.btnAlterar.enabled = false;
				barraBotoes.document.btnExcluir.enabled = false;
			} 
		}
		
		private function fecharJanela(): void {
//			PopUpUtil.fecharJanela(this);
			fechaJanela();
		}
		
		private function exibirJanelaCadastro(): void {
			_janelaParent = this;
			
			_janelaParentWidth = this.width;
			_janelaParentHeigth = this.height;
			
			this.removeAllChildren();
			
			this.width = _janelaCadastroWidth + 25;
			this.height = _janelaCadastroHeigth + 85;
			
			this.addChild(formularioCadastro);
			this.addChild(formularioCadastro.barraBotoes);
			
			formularioCadastro.objetoSelecionado = objetoSelecionado;
//			formularioCadastro.barraBotoes.document.btnFechar.addEventListener(MouseEvent.CLICK, botaoFecharFormularioCadastroPressionado);
		}
		
		private function exibirJanelaLista(): void {
			this.removeAllChildren();
			
			this.width = _janelaParentWidth;
			this.height = _janelaParentHeigth;
			
			this.addChild(_janelaParent.document.telaSelecao);
			this.addChild(barraBotoes);
		}
		
		private function desabilitarFormularioCadastro(componentes: Array): void {
			var campoHabilitado: Boolean = true; 
			var childPrincipal: UIComponent;
			for each (childPrincipal in componentes) {
				
				if(childPrincipal is CanvasITC) {
					var canvasPrincipal: CanvasITC = childPrincipal as CanvasITC;
					var childSecudario: UIComponent;
					for each (childSecudario in canvasPrincipal.getChildren()) {
						if (childSecudario is TabNavigator) {
							var objTab: TabNavigator = childSecudario as TabNavigator;
							desabilitarFormularioCadastro(objTab.getChildren());
						} else if (formularioCadastro.modo == FormularioCadastro.MODO_VISUALIZAR && !(childSecudario is SubtituloView)) {
							childSecudario.enabled = !campoHabilitado;						
						} else {
							childSecudario.enabled = campoHabilitado;						
						}
					}
				}
			}
		}
		
		private function desabilitarBotoesFormularioCadastro(): void {
			var botaoHabilitado: Boolean = true;
			if (formularioCadastro.modo == FormularioCadastro.MODO_VISUALIZAR) {
				formularioCadastro.barraBotoes.document.btnOK.visible = !botaoHabilitado;
				formularioCadastro.barraBotoes.document.btnLimpar.visible = !botaoHabilitado;
				formularioCadastro.barraBotoes.document.btnLimpar.includeInLayout = !botaoHabilitado;
				formularioCadastro.barraBotoes.document.btnCancelar.visible = !botaoHabilitado;
				
			} else if(formularioCadastro.modo == FormularioCadastro.MODO_ALTERAR){
				formularioCadastro.barraBotoes.document.btnOK.visible = botaoHabilitado;
				formularioCadastro.barraBotoes.document.btnLimpar.visible = !botaoHabilitado;
				formularioCadastro.barraBotoes.document.btnLimpar.includeInLayout = !botaoHabilitado;
				formularioCadastro.barraBotoes.document.btnCancelar.visible = botaoHabilitado;
				
			} else if(formularioCadastro.modo == FormularioCadastro.MODO_INCLUIR){
				formularioCadastro.barraBotoes.document.btnOK.visible = botaoHabilitado;
				formularioCadastro.barraBotoes.document.btnLimpar.visible = botaoHabilitado;
				formularioCadastro.barraBotoes.document.btnLimpar.includeInLayout = botaoHabilitado;
				formularioCadastro.barraBotoes.document.btnCancelar.visible = botaoHabilitado;
			}
			
		}
		
		public function itemExcluido(): void {
			_listaItensTabela = tabela.dataProvider as ArrayCollection;
			_listaItensTabela.removeItemAt(_listaItensTabela.getItemIndex(objetoSelecionado));
			objetoSelecionado = null;
			habilitarBotoesLista();
		}
		
		public function itemAlterado(): void {
			_listaItensTabela = tabela.dataProvider as ArrayCollection;
			var posicao: int = _listaItensTabela.getItemIndex(objetoSelecionado);
			_listaItensTabela.removeItemAt(posicao);
			objetoSelecionado = formularioCadastro.objetoSelecionado;
			_listaItensTabela.addItemAt(objetoSelecionado, posicao);
			tabela.selectedItem = objetoSelecionado;
			habilitarBotoesLista();
		}
		
		public function itemIncluido(): void {
			if (formularioCadastro.destino != null) {
//				botaoPesquisarPressionado(null);
				
				objetoSelecionado = null;
				habilitarBotoesLista();
			}
		}
		
		// Métodos de callback
		private function init(event: FlexEvent): void {
			tabela.dataProvider = _listaItensTabela;
			tabela.addEventListener(ListEvent.ITEM_CLICK, mudarObjetoSelecionado);
			configurarBarraBotoes();
		}
		
		private function mudarObjetoSelecionado(event: ListEvent): void {
			objetoSelecionado = tabela.selectedItem;
			habilitarBotoesLista();
		}
		
		public function botaoFecharFormularioCadastroPressionado(event: MouseEvent): void {
			if (formularioCadastro.modo == FormularioCadastro.MODO_ALTERAR) {
				itemAlterado();
			}
			if (formularioCadastro.modo == FormularioCadastro.MODO_INCLUIR) {
				itemIncluido();
			}
			formularioCadastro.botaoLimparPressionado(null);
			title = title.replace(regInc, "Manter");
			exibirJanelaLista(); //VERIFICAR FECHAMENTO DE JANELA..
		}
		
		public function botaoVisualizarPressionado(event: MouseEvent): void {
			if (alterarTituloJanela) {
				title = title.replace(regInc, "Visualizar");
			}
			
			exibirJanelaCadastro();
			formularioCadastro.modo = FormularioCadastro.MODO_VISUALIZAR;
			desabilitarFormularioCadastro(formularioCadastro.getChildren());
			desabilitarBotoesFormularioCadastro();
			formularioCadastro.botaoLimparPressionado(null);
			formularioCadastro.preencherCampos();
		}
	
		public function botaoIncluirPressionado(event: MouseEvent): void {
			if (alterarTituloJanela) {
				title = title.replace(regInc, "Incluir");
			}

			exibirJanelaCadastro();
			formularioCadastro.modo = FormularioCadastro.MODO_INCLUIR;
			desabilitarFormularioCadastro(formularioCadastro.getChildren());
			desabilitarBotoesFormularioCadastro();
			formularioCadastro.botaoLimparPressionado(null);
		}
	
		public function botaoAlterarPressionado(event: MouseEvent): void {
			if (alterarTituloJanela) {
				title = title.replace(regInc, "Alterar");
			}

			exibirJanelaCadastro();
			formularioCadastro.modo = FormularioCadastro.MODO_ALTERAR;
			desabilitarFormularioCadastro(formularioCadastro.getChildren());
			desabilitarBotoesFormularioCadastro();
			formularioCadastro.botaoLimparPressionado(null);
			formularioCadastro.preencherCampos();
		}
		
		protected function desejaExcluir(event: MouseEvent): void {
			Alerta.show("Deseja realmente excluir ?", "Aviso", Alerta.TIPO_PERGUNTA, null, botaoExcluirPressionado);
		}
	
		public function botaoExcluirPressionado(event: MouseEvent): void {
			var dto: SCReqDTO = new SCReqDTO();
			dto = montarDtoExclusao(dto);
			ServicoJavaUtil.getServico(OPERACAO_EXCLUIR_DADOS, destinoServicoJava, retornoExclusao, 
				MostraCursor.CURSOR_EXCLUIR).getOperation(OPERACAO_EXCLUIR_DADOS).send(dto);
		}
		
		protected function montarDtoExclusao(dto: SCReqDTO): SCReqDTO{
			dto.dados.objetoExcluido = objetoSelecionado;
			return dto;
		}
		
		protected function retornoExclusao(event: ResultEvent): void{
			Alerta.show("Registro excluído com sucesso.", "Aviso", Alerta.TIPO_OK);
			itemExcluido();
		}		
	
		public function botaoPesquisarPressionado(event: MouseEvent): void {
			objetoSelecionado = null;
			tabela.dataProvider = null;
			habilitarBotoesLista();
			var dto: SelGeralReqDto = montarDtoPesquisa();
			ServicoJavaUtil.getServico(OPERACAO_LISTAR_DADOS, destinoServicoJava, retornoPesquisa).getOperation(OPERACAO_LISTAR_DADOS).send(dto); 			
		}

		protected function montarDtoPesquisa(): SelGeralReqDto{
			return new SelGeralReqDto();
		}
		
		protected function retornoPesquisa(event: ResultEvent): void{
			if(event.result.dados.listaDados.length != 0){
				this.tabela.dataProvider = event.result.dados.listaDados as ArrayCollection;
			}else{
				Alerta.show("Nenhum registro encontrado.", "Aviso", Alerta.TIPO_INFORMACAO);
			}
		}		
		public function botaoFecharPressionado(event: MouseEvent): void {
			fecharJanela();
		}
	}
}